home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1997 April: Mac OS SDK / Dev.CD Apr 97 SDK1.toast / Development Kits (Disc 1) / Open Transport / OT1.1 Developer Release / Open Transport SDK / Open Tpt Client Developer / Samples / Internet / OTTcpCatchSample.cp < prev    next >
Encoding:
Text File  |  1996-11-19  |  8.9 KB  |  410 lines  |  [TEXT/MPS ]

  1. /*
  2.     File:        OTTcpCatchSample.cp
  3.  
  4.     Contains:    TCP catch sample
  5.  
  6.     Copyright:    © 1993-1995 by Apple Computer, Inc., all rights reserved.
  7.  
  8. */
  9.  
  10.  
  11. // OT TCP Catch Test Program (as an SIOW Tool)
  12.  
  13. #define lint
  14. #include <QuickDraw.h>
  15. #include <stdio.h>
  16. #include <StdLib.h>
  17. #include <TextUtils.h>
  18. #include <strings.h>
  19. #include <String.h>
  20. #include <Events.h>
  21. #include <Desk.h>
  22. #include <OpenTransport.h>
  23. #include <OpenTptInternet.h>
  24.  
  25.  
  26. /*******************************************************************************
  27. ** GLOBAL VARIABLES
  28. ********************************************************************************/
  29.  
  30. #define kMaxDataLen 256
  31.  
  32. const size_t    kMyPoolSize = 60000;
  33.  
  34. InetPort    gCatchPort        = 0;
  35. InetHost    gCatchIpAddr    = 0;
  36. InetPort      gPitchPort        = 0;
  37. InetHost    gPitchIpAddr    = 0;
  38.  
  39. unsigned short gBindCompleted        = 0;
  40. unsigned short gDataToRead            = 0;
  41. unsigned short gCallRcvOrdDiscon    = 0;
  42.  
  43. OTEventCode    gCode;
  44. TEndpoint*    gCookie;
  45. OSStatus    gErr;
  46.  
  47. unsigned char data[kMaxDataLen];
  48.  
  49. struct InetAddress reqsin, retsin, rcvsin;
  50.  
  51. /*******************************************************************************
  52. ** Function Prototypes
  53. ********************************************************************************/
  54.  
  55. void    Inits(void);
  56. void    CleanUp(void);
  57. void    Idle(void);    
  58. void    DoIt(void);
  59. Boolean    UserAbort(void);
  60.  
  61.  
  62. /*******************************************************************************
  63. **  main function
  64. ********************************************************************************/
  65.  
  66. void main()
  67. {
  68.     Inits();
  69.     DoIt();
  70.     CleanUp();
  71. }
  72.  
  73. /*******************************************************************************
  74. ** Initialize Quickdraw and ASLM
  75. ********************************************************************************/
  76.  
  77. void Inits()
  78. {
  79.     InitGraf(&qd.thePort);
  80.     if (InitOpenTransport() != kOTNoError)
  81.     {
  82.         fprintf(stderr, "OTTcpCatch: Could not initialize ASLM, exiting\n");
  83.         exit(1);
  84.     }
  85. }
  86.  
  87. /*******************************************************************************
  88. ** Clean up at the end
  89. ********************************************************************************/
  90.  
  91. void CleanUp()
  92. {
  93.     CloseOpenTransport();
  94. }
  95.  
  96. /*******************************************************************************
  97. ** Idle
  98. ********************************************************************************/
  99.  
  100. void Idle()
  101. {
  102.     SystemTask();
  103. }
  104.  
  105. /*******************************************************************************
  106. ** EventHandler
  107. ********************************************************************************/
  108.  
  109. pascal void EventHandler(void*, OTEventCode event, OTResult result, void* cookie)
  110. {
  111.     OTEventCode tempevent = 0;
  112.  
  113.     switch(event)
  114.     {
  115.         case T_OPENCOMPLETE:
  116.                             gErr = (OSStatus)result;
  117.                             gCookie = (TEndpoint*) cookie;
  118.                             gCode = event;
  119.                             break;
  120.         case T_DATA:
  121.                             gDataToRead = 1;
  122.                             break;
  123.         case T_BINDCOMPLETE:
  124.                             gBindCompleted = 1;
  125.                             break;
  126.         case T_ORDREL:
  127.                             gCallRcvOrdDiscon = 1;
  128.                             break;
  129.         default:
  130. // OTDebugBreak("EventHandler got unexpected event");
  131.                             tempevent = event;
  132.                             break;
  133.     }
  134.     return;
  135. }
  136.  
  137. /*******************************************************************************
  138. ** DoIt
  139. ********************************************************************************/
  140.  
  141. void DoIt()
  142. {
  143.     TEndpoint*        ep = NULL;
  144.     TEndpointInfo    info;
  145.     TBind            req, ret;
  146.     TCall            mycall;
  147.     OSStatus        err = kOTNoError;
  148.     long            myport;
  149.     InetHost        myaddr;
  150.     char            mystr[255];
  151.     OTFlags            flags;
  152.     long            bytes = 0;
  153.  
  154.     myport = 0;
  155.     fprintf(stderr, "Catch port ? (enter TCP port number)\n");
  156.     if ( gets(mystr) != 0 )
  157.     {
  158.         stringtonum(mystr, &myport);
  159.         gCatchPort = (InetPort) myport;
  160.     }
  161.     myaddr = 0;
  162.     fprintf(stderr, "Catch IP address ? (enter IP address)\n");
  163.     if ( gets(mystr) != 0 )
  164.     {
  165.         if ( OTInetStringToHost(mystr, &myaddr) == 0 )
  166.         {
  167.             gCatchIpAddr = (InetHost) myaddr;
  168.         }
  169.     }
  170.     myport = 0;
  171.     fprintf(stderr, "Pitch port ? (enter TCP port number)\n");
  172.     if ( gets(mystr) != 0 )
  173.     {
  174.         stringtonum(mystr, &myport);
  175.         gPitchPort =(InetPort)  myport;
  176.     }
  177.     myaddr = 0;
  178.     fprintf(stderr, "Pitch IP address ? (enter IP address)\n");
  179.     if ( gets(mystr) != 0 )
  180.     {
  181.         if ( OTInetStringToHost(mystr, &myaddr) == 0 )
  182.         {
  183.             gPitchIpAddr = (InetHost) myaddr;
  184.         }
  185.     }
  186.     fprintf(stderr, "The program will listen for a packet on port <%d>\n", gCatchPort);
  187.     fprintf(stderr, "until \'cmd .\' keys are pressed\n");
  188.  
  189.     memset(&reqsin, 0, sizeof(struct InetAddress));
  190.     memset(&retsin, 0, sizeof(struct InetAddress));
  191.     memset(&rcvsin, 0, sizeof(struct InetAddress));
  192.     memset(&req, 0, sizeof(TBind));
  193.     memset(&ret, 0, sizeof(TBind));
  194.  
  195.     OTInitInetAddress(&reqsin, gCatchPort, gCatchIpAddr);
  196.  
  197.     do
  198.     {
  199.         //
  200.         // Now create a TCP
  201.         //
  202. #if 1
  203.         gCode = 0;
  204.         gCookie = NULL;
  205.         gErr = 0;
  206.         err = OTAsyncOpenEndpoint(OTCreateConfiguration(kTCPName), 0, 
  207.                                   &info, EventHandler, 0);
  208.         if ( err == 0 )
  209.         {
  210.             while ( gCode == 0 )
  211.                 OTIdle();
  212.             err = gErr;
  213.         }
  214.         if ( err != 0 )
  215.         {
  216.             ep = NULL;
  217.             fprintf(stderr,"ERROR: OpenEndpoint(\"TCP\") failed with %d\n", err);
  218.             break;
  219.         }
  220.         else
  221.         {
  222.             ep = gCookie;
  223.         }
  224. #else
  225.         ep = OTOpenEndpoint(OTCreateConfiguration(kTCPName), 0, &info, &err);
  226.  
  227.         if ( ep == NULL || err != kOTNoError )
  228.         {
  229.             ep = NULL;
  230.             fprintf(stderr,"ERROR: OpenEndpoint(\"TCP\") failed with %d\n", err);
  231.             break;
  232.         }
  233.  
  234.         err = ep->SetSynchronous();
  235.         if ( err != kOTNoError )
  236.         {
  237.             fprintf(stderr, "ERROR: SetSynchronous() failed with %d\n", err);
  238.             break;
  239.         }
  240.  
  241.         //
  242.         // Install notifier we're going to use for testing
  243.         //
  244.         err = ep->InstallNotifier(&EventHandler, 0);
  245.         if ( err != kOTNoError )
  246.         {
  247.             fprintf(stderr, "ERROR: InstallNotifier() failed with %d\n", err);
  248.             break;
  249.         }
  250. #endif
  251.         //
  252.         // Try to bind
  253.         // 
  254.         req.addr.len = sizeof(struct InetAddress);
  255.         req.addr.buf = (unsigned char *) &reqsin;
  256.         req.qlen = 5;                                        // don't care for tcp
  257.         ret.addr.maxlen = sizeof(struct InetAddress);
  258.         ret.addr.buf = (unsigned char *) &retsin;
  259.  
  260.         // bind tcp to current address and port
  261.         err = ep->Bind(&req, &ret);
  262.         if ( err != kOTNoError )
  263.         {
  264.             fprintf(stderr, "ERROR: Bind() failed with %d\n", err);
  265.             break;
  266.         }
  267.  
  268.         err = ep->SetSynchronous();
  269.         if ( err != kOTNoError )
  270.         {
  271.             fprintf(stderr, "ERROR: SetSynchronous() failed with %d\n", err);
  272.             break;
  273.         }
  274.  
  275.         err = ep->SetBlocking();
  276.         if ( err != kOTNoError )
  277.         {
  278.             fprintf(stderr, "ERROR: SetBlocking() failed with %d\n", err);
  279.             break;
  280.         }
  281.  
  282.         memset(&mycall, 0, sizeof(TCall));
  283.  
  284.         mycall.addr.maxlen = sizeof(struct InetAddress);
  285.         mycall.addr.len = sizeof(struct InetAddress);
  286.         mycall.addr.buf = (unsigned char *) &rcvsin;
  287.         mycall.opt.maxlen = 0;
  288.         mycall.opt.buf = 0;
  289.         mycall.udata.maxlen = 0;
  290.  
  291.         err = ep->Listen(&mycall);
  292.         if ( err != kOTNoError )
  293.         {
  294.             fprintf(stderr, "ERROR: Listen() failed with %d\n", err);
  295.             break;
  296.         }
  297.  
  298.         ep->Accept(ep, &mycall);
  299.         if ( err != kOTNoError )
  300.         {
  301.             fprintf(stderr, "ERROR: Accept() failed with %d\n", err);
  302.             break;
  303.         }
  304.  
  305.         err = ep->SetAsynchronous();
  306.         if ( err != kOTNoError )
  307.         {
  308.             fprintf(stderr, "ERROR: SetAsynchronous() failed with %d\n", err);
  309.             break;
  310.         }
  311.  
  312.         do
  313.         {
  314.             //
  315.             // Try to receive some data
  316.             //
  317.             if ( gDataToRead == 1 )
  318.             {
  319.                 gDataToRead = 0;
  320.                 bytes = ep->Rcv(data, kMaxDataLen, &flags);
  321.                 if (bytes >= 0)
  322.                     fprintf(stderr, "Packet received\nsize: <%d> data: %s", bytes, data);
  323.                 else
  324.                     fprintf(stderr, "ERROR: Rcv() failed with %d\n", bytes);
  325.                 break;
  326.             }
  327.             Idle();
  328.         } while (!UserAbort());
  329.     } while (false);
  330.  
  331.     if ( ep != NULL )
  332.     {
  333.  
  334.         err = ep->SetSynchronous();
  335.         if ( err != kOTNoError )
  336.         {
  337.             fprintf(stderr, "ERROR: SetSynchronous() failed with %d\n", err);
  338.             return;
  339.         }
  340.  
  341.         err = ep->SndOrderlyDisconnect();
  342.         if ( err != kOTNoError )
  343.         {
  344.             if (err == kOTLookErr)
  345.                 fprintf(stderr, "SndOrderlyDisconnect() returns %d\n", err);
  346.             else
  347.                 fprintf(stderr, "ERROR: SndOrderlyDisconnect() failed with %d\n", err);
  348.         }
  349.     
  350.         while ( gCallRcvOrdDiscon == 0 )
  351.             Idle();
  352.         err = ep->RcvOrderlyDisconnect();
  353.         if ( err != kOTNoError )
  354.         {
  355.             fprintf(stderr, "ERROR: RcvOrderlyDisconnect() failed with %d\n", err);
  356.         }
  357.     
  358.         //
  359.         // Remove notifier
  360.         //
  361.         ep->RemoveNotifier();
  362.         //
  363.         // Try to Unbind
  364.         // 
  365.     /*
  366.         err = ep->Unbind();
  367.         if ( err != kOTNoError )
  368.         {
  369.             fprintf(stderr, "ERROR: Unbind() returned %d\n", err);
  370.         }
  371.     */
  372.         //
  373.         // Get rid of endpoint.
  374.         //
  375.         err = OTCloseProvider(ep);
  376.         if ( err != kOTNoError )
  377.         {
  378.             fprintf(stderr, "ERROR: CloseEndpoint() failed with %d\n", err);
  379.         }
  380.     }
  381.     fprintf(stderr, "Bye\n");
  382. }
  383.  
  384. /*******************************************************************************
  385. ** IsPressed
  386. ********************************************************************************/
  387.  
  388. Boolean IsPressed(UInt16 k, KeyMap map)
  389. {
  390.     UInt8* keyMap    = (UInt8*)map;
  391.     return (keyMap[k >> 3] >> (k & 7) & 1);
  392. }
  393.  
  394. /*******************************************************************************
  395. ** CmdKey
  396. ********************************************************************************/
  397.  
  398. Boolean UserAbort()
  399. {
  400.     KeyMap    keyMap;
  401.     
  402.     GetKeys(keyMap);
  403.     if ( IsPressed(0x37, keyMap) && 
  404.         (IsPressed(0x2F, keyMap) || IsPressed(0x41, keyMap)) )
  405.         return true;
  406.     else
  407.         return false;
  408. }
  409.  
  410.